from pyecharts.charts import Map
import pandas as pd
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode

provinces = ["北京", "天津", "上海", "重庆", "河北", "山西", "辽宁", "吉林", "黑龙江", "江苏", "浙江", "安徽", "福建",
             "江西", "山东", "河南", "湖北", "湖南", "广东", "广西", "海南", "四川", "贵州", "云南", "西藏", "陕西",
             "甘肃", "青海", "宁夏", "新疆", "内蒙古", "台湾", "香港", "澳门"]

# 广东省各城市的数据
#city_data = [('广州市', 100), ('信阳市', 150), ('珠海市', 80), ('汕头市', 60), ('佛山市', 90)]
csv_file = 'D:/Courses/SmallThree/scrapy_spider/data.csv'

# 读取CSV文件
df = pd.read_csv(csv_file, encoding='gbk')

# 清理数据：只保留有城市信息的行
df_with_cities = df[df['city'].notna()]

# 统计每个城市的数量
city_counts = df['city'].value_counts().reset_index()
city_counts.columns = ['city', '计数']
#print(city_counts)

# 准备数据格式以用于地图（转换为列表的元组）
city_data = city_counts.to_records(index=False).tolist()
#print(city_data)

# 为了在鼠标触碰时显示依托单位名和所在省份，我们需要一个字典来存储这些信息
# 但由于一个城市可能对应多个依托单位和省份，我们需要一个更复杂的数据结构
# 这里，我们使用一个字典，其键是城市名，值是一个列表，列表中的每个元素都是一个包含依托单位和省份的元组
city_info = {}
for index, row in df.iterrows():
    city = row['city']
    if city not in city_info:
        city_info[city] = []
    institute = row['name']
    #print(institute)
    province = row['province']
    city_info[city].append((institute, province))
    #print(city_info['海淀区'])

city_mation = {}


city = [param[0] for param in city_data]
#print(city)
info_list = [city_info[city_name] for city_name in city]
#print(info_list)
for info in info_list:
    info_str = '<br/>'.join(f'{institute}（{province}）' for institute, province in info)
    #print(info_str)

#for city_name in city:


    # 但是，由于Pyecharts的Map组件的tooltip不支持直接显示列表或复杂数据结构，
    # 我们需要定义一个formatter函数来在tooltip中显示这些信息


def tooltip_formatter(params):
    #city = params
    city = params.name
    info_list = city_info.get(city, [])
    if not info_list:
        info_str = '无实验室信息'
    else:
        info_str = '<br/>'.join(f'{institute}（{province}）' for institute, province in info_list)
    #print(info_str) #<br/>数量: {params.value}
    return f'{city} <br/>信息: {info_str}'

    # info_list = city_info.get(city, [])
    # city = [param[0] for param in params][city][1]
    # info_list = [city_info[city_name] for city_name in city]
    # print(info_list)


for province in provinces:
    # 创建地图对象
    m = Map()
    # 添加数据到地图（注意：这里假设每个省份的数据都是一个城市名和值的列表）
    m.add(f"{province}实验室数据", [list(z) for z in city_data], province)
    # 设置全局选项
    m.set_global_opts(
        title_opts=opts.TitleOpts(title=f"{province}地图 - 实验室数据"),
        visualmap_opts=opts.VisualMapOpts(max_=150),
        tooltip_opts=opts.TooltipOpts(formatter=tooltip_formatter)

 #formatter= "{b}:{c}"+tooltip_formattertooltip_formatter
        )
    # 设置系列标签显示（可选）
    m.set_series_opts(label_opts=opts.LabelOpts(is_show=True))

    """
    chart_id = m.chart_id
    js_func = f  (''')  
        chart_{chart_id}.on('click', function(params) {{  
            if (params.componentType === 'series' && params.seriesType === 'map') {{  
                // 假设每个城市的具体信息存储在一个全局对象或可以通过某种方式获取  
                // 这里我们简单使用一个函数来模拟获取城市信息  
                var cityInfo = getCityInfo(params.name);  

                // 显示城市信息  
                alert('城市: ' + params.name + '\\n具体信息: ' + cityInfo);  

                // 如果需要，也可以在这里添加标记点，但通常点击事件用于显示信息  
                // 添加标记点的逻辑可以保留在您的原始函数中，但使用 'click' 而不是 'dblclick'  
                // ...  
            }}  
        }});  

        // 假设的获取城市信息的函数  
        function getCityInfo(cityName) {{  
            // 这里应该根据您的数据源来返回城市的具体信息  
            // 这里只是一个示例，返回了一个静态字符串  
            
            
            return '这里是' + cityName + '的详细信息';  
        }}  
    ('''
    m.add_js_funcs(js_func)
    """

    # 生成HTML文件
    html_file = f"D:/Courses/SmallThree/scrapy_spider/{province}地图.html"
    m.render(html_file)
    # 生成HTML文件
